<?php
namespace common\services\SMS;
/**
 * 空间畅想 短信接口
 */
    class SmsParApi {
        /**私有静态参数**/
        private $name = 'lyjqhy';          //账号
        private $password = 'turydyng';       //密码
        private $seed;                      //当前时间
        private $dest;                      //手机号码
        private $content;                   //短信内容
        private $ext;                       //扩展号码
        private $reference;                 //参考信息
        private $enCode = 'UTF-8';          //编码（UTF-8、GBK）
        private $method = 'POST';           //请求方式（POST、GET）
        private $delay;                     //定时:20180521160530
        private $model;                     //json
        /**字符类型**/
        private function encoding($str,$urlCode){
            if( !empty($str) ){
                $fileType = mb_detect_encoding($str , array('UTF-8','GBK','LATIN1','BIG5')) ;
            }
            return mb_convert_encoding($str, $urlCode, $fileType);
        }

        /**
         * get请求
         * @param $url
         * @param $params
         * @return string
         */
        private function send_get($url,$params){
            $getdata = http_build_query($params);
            $content = file_get_contents($url.'?'.$getdata);
            return $content;
        }

        /**
         * post请求
         * @param $url
         * @param $params
         * @return mixed
         */
        private function send_post_curl($url,$params){
            $postdata = http_build_query($params);
            $length = strlen($postdata);
            $cl = curl_init($url);//①：初始化
            curl_setopt($cl, CURLOPT_POST, true);//②：设置属性
            curl_setopt($cl,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
            curl_setopt($cl,CURLOPT_HTTPHEADER,array("Content-Type: application/x-www-form-urlencoded","Content-length: ".$length));
            curl_setopt($cl,CURLOPT_POSTFIELDS,$postdata);
            curl_setopt($cl,CURLOPT_RETURNTRANSFER,true);
            $content = curl_exec($cl);//③：执行并获取结果
            curl_close($cl);//④：释放句柄
            return $content;
        }

        /**
         * 发送短信
         * @param $dest  手机号码
         * @param $content 内容含有【】的字符串内容
         * @param string $ext 扩展号 可以为空
         * @param string $reference 参考信息可以为空
         * @return mixed|string
         */
        public function send_sms($dest,$content,$ext='',$reference=''){
            $this->dest         = $dest;
            //手机号码（多个号码用“半角逗号”分开），GET方式每次最多100个号码，POST方式号码个数不限制，但建议不超过3万个
            $this->seed         = date('YmdHis');
            //当前时间，格式：YYYYMMDD HHMMSS，例如：20130806102030。客户时间早于或晚于网关时间超过30分钟，则网关拒绝提交。
            //从php5.1.0开始，PHP.ini里加了date.timezone这个选项，并且默认情况下是关闭的也就是显示的时间（无论用什么php命令）都是格林威治标准时间和我们的时间（北京时间）差了正好8个小时。
            //找到php.ini中的“;date.timezone =”这行，将“;”去掉，改成“date.timezone = PRC”（PRC：People's Republic of China 中华人民共和国），重启Apache，问题解决。
            $this->content      = $content;
            //短信内容//短信内容。最多500个字符。
            $this->ext          = $ext;
            //扩展号码//扩展号码（视通道是否支持扩展，可以为空或不填）
            $this->reference    = $reference;
            //参考信息//参考信息（最多50个字符，在推送状态报告、推送上行时，推送给合作方，本参数不参与任何下行控制，仅为合作方提供方便，可以为空或不填）如果不知道如何使用，请忽略该参数，不能含有半角的逗号和分号。
            $url                ='';
            //发送的url地址
            if ($this->enCode == 'UTF-8'){
                $url = 'http://160.19.212.218:8080/eums/utf8/send_strong.do';//UTF-8编码接口地址
            }else if ($this->enCode =='GBK'){
                $url = 'http://160.19.212.218:8080/eums/send_strong.do';//GBK编码接口地址
            }
            $this->content  = $this->encoding($this->content,$this->enCode);//注意编码，字段编码要和接口所用编码一致，有可能出现汉字之类的记得转换编码
            //utf8和gbk编码请自行转换
            $params = array(
                'name' => $this->encoding($this->name,$this->enCode),//帐号，由网关分配
                'seed' => date('YmdHis'),
                'key' => strtolower(md5(strtolower(md5($this->password)).$this->seed)),//md5( md5(password)  +  seed) )
                //其中“+”表示字符串连接。即：先对密码进行md5加密，将结果与seed值合并，再进行一次md5加密。
                //两次md5加密后字符串都需转为小写。
                //例如：若当前时间为2013-08-06 10:20:30，密码为123456，
                //则：key=md5(md5(“123456”) + “20130806102030” )
                //则：key=md5(e10adc3949ba59abbe56e057f20f883e20130806102030)
                //则：key= cd6e1aa6b89e8e413867b33811e70153
                'dest' => $this->dest,
                'content' => $this->content,
                'ext' => $this->ext,
                'reference' => $this->reference
            );
            $params = array_filter($params);
            //echo strtolower(md5(strtolower(md5('123456')).'20130806102030')).'<br/>';
            //echo $method.'请求如下：<br/>';
            if ($this->method=='POST'){
                $resp =  $this->send_post_curl($url, $params);//POST请求，数据返回格式为error:xxx,success:xxx
            }else if ($this->method=='GET'){
                $resp =  $this->send_get($url, $params);//GET请求，数据返回格式为error:xxx,success:xxx
            }
            return $resp;
        }

        /**
         * 发送短信(多号码多内容)
         * @param $dest 号码半角符号隔开的字符串
         * @param $content 内容array()数组格式，单项含有‘【】’的字符串的信息内容
         * @param string $ext 扩展号 可以为空
         * @param string $reference 参考信息可为空
         * @param string $delay 定时时间可为空。

         * @return mixed|string
         */
        public function send_sms_batch($dest,$content,$ext='',$reference='',$delay=''){
            $this->dest         = $dest;
            //手机号码（多个号码用“半角逗号”分开），GET方式每次最多100个号码，POST方式号码个数不限制，但建议不超过3万个
            $this->seed         = date('YmdHis');
            //当前时间，格式：YYYYMMDD HHMMSS，例如：20130806102030。客户时间早于或晚于网关时间超过30分钟，则网关拒绝提交。
            //从php5.1.0开始，PHP.ini里加了date.timezone这个选项，并且默认情况下是关闭的也就是显示的时间（无论用什么php命令）都是格林威治标准时间和我们的时间（北京时间）差了正好8个小时。
            //找到php.ini中的“;date.timezone =”这行，将“;”去掉，改成“date.timezone = PRC”（PRC：People's Republic of China 中华人民共和国），重启Apache，问题解决。
            $this->content      = $content;
            //短信内容//短信内容。最多500个字符。
            $this->ext          = $ext;
            //扩展号码//扩展号码（视通道是否支持扩展，可以为空或不填）
            $this->reference    = $reference;
            //参考信息//参考信息（最多50个字符，在推送状态报告、推送上行时，推送给合作方，本参数不参与任何下行控制，仅为合作方提供方便，可以为空或不填）如果不知道如何使用，请忽略该参数，不能含有半角的逗号和分号。
            $this->delay        = $delay;
            //
            $url                ='';
            //发送的url地址
            if ($this->enCode == 'UTF-8'){
                $url = 'http://160.19.212.218:8080/eums/utf8/send_batch.do';//UTF-8编码接口地址
            }else if ($this->enCode =='GBK'){
                $url = 'http://160.19.212.218:8080/eums/send_batch.do';//GBK编码接口地址
            }
            //
            $pk_total = count($this->content);												//发送的总包数//提交包的数量，一批手机号发相同的短信内容算一个包
            //短信内容校验
            for($i=0;$i<$pk_total; $i++) { 												//短信内容校验
                if($this->content[$i] == "" ){
                    return "单条信息内容不能为空";
                }
                if($this->content[$i] != "" && (strlen($this->content[$i])+mb_strlen($this->content[$i],"UTF8"))/2 > 500){
                    return "单条信息内容不能大于500个字符";
                }
            }
            $params = "name=".$this->name."&seed=".$this->seed."&key=".strtolower(md5(strtolower(md5($this->password)).$this->seed))."&pk_total=".$pk_total;	//发送参数拼接
            if($this->reference != ""){
                $params .= "&reference=".$this->reference;									//发送参数拼接
            }
            for($i=0;$i<$pk_total;$i++){
                $con  = $this->encoding($this->content[$i],$this->enCode);//注意编码，字段编码要和接口所用编码一致，有可能出现汉字之类的记得转换编码
                $arr = array(
                    'dest_'.($i+1) 		=>	$this->dest,
                    'content_'.($i+1) 	=>	$con,
                    'ext_'.($i+1) 		=>	$this->ext,
                    'delay_'.($i+1) 	=>	$this->delay
                );
                $params .= "&".http_build_query(array_filter($arr));					//发送参数拼接
            }
            //echo $method.'请求如下：<br/>';
            $resp =  $this->send_post_curl($url, $params);//POST请求，数据返回格式为error:xxx,success:xxx
            return $resp;
        }

        /**
         * 查询余额
         * @return string
         */
        public function query_balance(){
            $this->seed         = date('YmdHis');
            //当前时间，格式：YYYYMMDD HHMMSS，例如：20130806102030。客户时间早于或晚于网关时间超过30分钟，则网关拒绝提交。
            //从php5.1.0开始，PHP.ini里加了date.timezone这个选项，并且默认情况下是关闭的也就是显示的时间（无论用什么php命令）都是格林威治标准时间和我们的时间（北京时间）差了正好8个小时。
            //找到php.ini中的“;date.timezone =”这行，将“;”去掉，改成“date.timezone = PRC”（PRC：People's Republic of China 中华人民共和国），重启Apache，问题解决。
            $url                ='';
            //发送的url地址
            if ($this->enCode == 'UTF-8'){
                $url = 'http://160.19.212.218:8080/eums/utf8/balance_strong.do';//UTF-8编码接口地址
            }else if ($this->enCode=='GBK'){
                $url = 'http://160.19.212.218:8080/eums/balance_strong.do';//GBK编码接口地址
            }
            //utf8和gbk编码请自行转换
            $params = array(
                'name' => $this->encoding($this->name,$this->enCode),//帐号，由网关分配
                'seed' => date('YmdHis'),
                'key' => strtolower(md5(strtolower(md5($this->password)).$this->seed)),//md5( md5(password)  +  seed) )
                //其中“+”表示字符串连接。即：先对密码进行md5加密，将结果与seed值合并，再进行一次md5加密。
                //两次md5加密后字符串都需转为小写。
                //例如：若当前时间为2013-08-06 10:20:30，密码为123456，
                //则：key=md5(md5(“123456”) + “20130806102030” )
                //则：key=md5(e10adc3949ba59abbe56e057f20f883e20130806102030)
                //则：key= cd6e1aa6b89e8e413867b33811e70153
            );
            //echo strtolower(md5(strtolower(md5('123456')).'20130806102030')).'<br/>';
            //echo $method.'请求如下：<br/>';
            $resp =  $this->send_get($url,$params);//GET请求，数据返回格式为error:xxx,success:xxx
            return $resp;
        }

        /**
         * 状态拉取
         **/
        public function pull_report(){
            $this->seed         = date('YmdHis');
            //当前时间，格式：YYYYMMDD HHMMSS，例如：20130806102030。客户时间早于或晚于网关时间超过30分钟，则网关拒绝提交。
            //从php5.1.0开始，PHP.ini里加了date.timezone这个选项，并且默认情况下是关闭的也就是显示的时间（无论用什么php命令）都是格林威治标准时间和我们的时间（北京时间）差了正好8个小时。
            //找到php.ini中的“;date.timezone =”这行，将“;”去掉，改成“date.timezone = PRC”（PRC：People's Republic of China 中华人民共和国），重启Apache，问题解决。
            $url                ='';
            //发送的url地址
            if ($this->enCode == 'UTF-8'){
                $url = 'http://160.19.212.218:8080/eums/utf8/report_strong.do';//UTF-8编码接口地址
            }else if ($this->enCode =='GBK'){
                $url = 'http://160.19.212.218:8080/eums/report_strong.do';//GBK编码接口地址
            }
            //utf8和gbk编码请自行转换
            $params = array(
                'name' => $this->encoding($this->name,$this->enCode),//帐号，由网关分配
                'seed' => date('YmdHis'),
                'key' => strtolower(md5(strtolower(md5($this->password)).$this->seed)),//md5( md5(password)  +  seed) )
                //其中“+”表示字符串连接。即：先对密码进行md5加密，将结果与seed值合并，再进行一次md5加密。
                //两次md5加密后字符串都需转为小写。
                //例如：若当前时间为2013-08-06 10:20:30，密码为123456，
                //则：key=md5(md5(“123456”) + “20130806102030” )
                //则：key=md5(e10adc3949ba59abbe56e057f20f883e20130806102030)
                //则：key= cd6e1aa6b89e8e413867b33811e70153
            );
            //echo strtolower(md5(strtolower(md5('123456')).'20130806102030')).'<br/>';
            //echo $method.'请求如下：<br/>';
            if ($this->method=='POST'){
                $resp =  $this->send_post_curl($url, $params);//POST请求，数据返回格式为error:xxx,success:xxx
            }else if ($this->method=='GET'){
                $resp =  $this->send_get($url, $params);//GET请求，数据返回格式为error:xxx,success:xxx
            }
            return $resp;
        }
        /**
         * 拉取上行
         **/
        public function pull_mo(){
            $this->seed         = date('YmdHis');
            //当前时间，格式：YYYYMMDD HHMMSS，例如：20130806102030。客户时间早于或晚于网关时间超过30分钟，则网关拒绝提交。
            //从php5.1.0开始，PHP.ini里加了date.timezone这个选项，并且默认情况下是关闭的也就是显示的时间（无论用什么php命令）都是格林威治标准时间和我们的时间（北京时间）差了正好8个小时。
            //找到php.ini中的“;date.timezone =”这行，将“;”去掉，改成“date.timezone = PRC”（PRC：People's Republic of China 中华人民共和国），重启Apache，问题解决。
            $url                ='';
            //发送的url地址
            if ($this->enCode == 'UTF-8'){
                $url = 'http://160.19.212.218:8080/eums/utf8/mo_strong.do';//UTF-8编码接口地址
            }else if ($this->enCode =='GBK'){
                $url = 'http://160.19.212.218:8080/eums/mo_strong.do';//GBK编码接口地址
            }
            //utf8和gbk编码请自行转换
            $params = array(
                'name' => $this->encoding($this->name,$this->enCode),//帐号，由网关分配
                'seed' => date('YmdHis'),
                'key' => strtolower(md5(strtolower(md5($this->password)).$this->seed)),//md5( md5(password)  +  seed) )
                //其中“+”表示字符串连接。即：先对密码进行md5加密，将结果与seed值合并，再进行一次md5加密。
                //两次md5加密后字符串都需转为小写。
                //例如：若当前时间为2013-08-06 10:20:30，密码为123456，
                //则：key=md5(md5(“123456”) + “20130806102030” )
                //则：key=md5(e10adc3949ba59abbe56e057f20f883e20130806102030)
                //则：key= cd6e1aa6b89e8e413867b33811e70153
            );
            //echo strtolower(md5(strtolower(md5('123456')).'20130806102030')).'<br/>';
            //echo $method.'请求如下：<br/>';
            if ($this->method=='POST'){
                $resp =  $this->send_post_curl($url, $params);//POST请求，数据返回格式为error:xxx,success:xxx
            }else if ($this->method=='GET'){
                $resp =  $this->send_get($url, $params);//GET请求，数据返回格式为error:xxx,success:xxx
            }
            return $resp;
        }
    }
?>